package com.hsu.hsurpc.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.Charset;

/**
 * 配置工具类，自动识别配置文件类型并自动加载，优先加载 YAML，若不存在则加载 properties
 * @Author Hsu琛君珩
 * @Date 2024-09-18 13:50
 * @Description
 * @Version: v1.0.0
 */
public class ConfigUtils {

    private static final Logger log = LoggerFactory.getLogger(ConfigUtils.class);

    /**
     * 加载配置对象，默认不区分环境，优先加载 Properties 文件
     *
     * @param tClass 配置类的 Class 对象
     * @param prefix 配置项前缀
     * @return 加载的配置对象
     * @param <T> 泛型
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, Charset charset) {
        return loadConfig(tClass, prefix, "", charset);
    }

    /**
     * 加载配置对象，支持区分环境，优先加载 Properties 文件
     *
     * @param tClass 配置类的 Class 对象
     * @param prefix 配置项前缀
     * @param environment 环境（如: prod, test）
     * @return 加载的配置对象
     * @param <T> 泛型
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment, Charset charset) {
        // 构造配置文件名
        String configFile = "application";
        if (StrUtil.isNotBlank(environment)) {
            configFile += "-" + environment;
        }

//        // 优先尝试加载 .yml 文件
//        String yamlFile = configFile + ".yml";
//        try {
//            log.info("尝试加载 YAML 配置文件: {}", yamlFile);
//            T config = YamlConfigUtils.loadYamlConfig(yamlFile, tClass);
//            log.info("加载的配置文件类型: YAML");
//            return config;
//        } catch (Exception e) {
//            log.warn("加载 YAML 文件失败: {}, 尝试加载 Properties 文件", yamlFile);
//
//            // YAML 文件不存在时，尝试加载 .properties 文件
//            try {
//                String propertiesFile = configFile + ".properties";
//                log.info("尝试加载 Properties 配置文件: {}", propertiesFile);
//                T config = PropertiesConfigUtils.loadPropertiesConfig(propertiesFile, tClass, charset);
//                log.info("加载的配置文件类型: Properties");
//                return config;
//            } catch (Exception propertiesException) {
//                log.error("加载 Properties 文件失败: {}", configFile + ".properties");
//                throw new RuntimeException("无法加载配置文件", propertiesException);
//            }
//        }
        // 优先加载 Properties 文件
        String propertiesFile = configFile + ".properties";
        try {
            log.info("尝试加载 Properties 配置文件: {}", propertiesFile);
            Props props = new Props(propertiesFile);
            T config = props.toBean(tClass, prefix);
            log.info("加载的配置文件类型: Properties");
            return config;
        } catch (Exception e) {
            log.warn("加载 Properties 文件失败: {}, 尝试加载 YAML 文件", propertiesFile);
            // 如果 Properties 加载失败，尝试加载 YAML 文件
            try {
                String yamlFile = configFile + ".yml";
                log.info("尝试加载 YAML 配置文件: {}", yamlFile);
                T config = YamlConfigUtils.loadYamlConfig(yamlFile, tClass);
                log.info("加载的配置文件类型: YAML");
                return config;
            } catch (Exception yamlException) {
                log.error("加载 YAML 文件失败: {}", configFile + ".yml");
                throw new RuntimeException("无法加载配置文件", yamlException);
            }
        }
    }
}
